package com.example.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtParserBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.io.Decoders;
import io.jsonwebtoken.security.Keys;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;

import javax.crypto.SecretKey;
import java.util.Date;
import java.util.Map;

/**
 * Created with IntelliJ IDEA.
 * Description:JWT工具包
 * User: bjc
 * Date: 2025-08-03
 * Time: 11:08
 */
@Slf4j
public class JwtUtils {
    //1小时（毫秒为单位）
    public static final long JWT_EXPIRATION = 60*60*1000;

    //密钥,这个是用来校验生成的JWT令牌的合法性
    //需要保持256位，否则不能设置为密钥，所以需要使用特定方法来创建一个密钥,创建方法genKey
    private static final String secretStr = "Wpl4Pm27XMcGWoFnkHMuOGTQxb739XWLV4NOQvdHj9g=";
    //生成安全密钥
    private static final SecretKey KEY = Keys.hmacShaKeyFor(Decoders.BASE64.decode(secretStr));


    /**
     * 生成JWT令牌
     * @param claim
     * @return
     */
    public static String genJwt(Map<String,Object> claim){
        String jwt = Jwts.builder()
                .setClaims(claim)//设置JWt中的负载内容，由键值对组成
                .setExpiration(new Date(System.currentTimeMillis()+JWT_EXPIRATION))//设置JWT令牌过期时间
                .signWith(KEY)//设置签名密钥
                .compact();//生成JWT令牌
        log.info("生成JWT令牌：{}",jwt);
        return jwt;
    }
    /**
     * 解析JWT令牌
     * @param token jwt令牌
     * @return JWT中第二部分负载payload中存储的内容
     */
    public static Claims parseJwt(String token){
        //1.验证token的合法性
        if(!StringUtils.hasLength( token)){
            return null;
        }
        //2.创建解析器，设置签名密钥
        JwtParserBuilder jwtParserBuilder = Jwts.parserBuilder().setSigningKey(KEY);
        Claims claims = null;
        try {
            //3.解析JWT令牌
            claims = jwtParserBuilder.build().parseClaimsJws(token).getBody();
        } catch (Exception e) {
            log.error("解析JWT令牌失败：{}",e.getMessage());
            return null;
        }
        return claims;
    }
}
